home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 26 / CU Amiga Magazine's Super CD-ROM 26 (1998)(EMAP Images)(GB)[!][issue 1998-09].iso / CUCD / PowerPC / uae-0.8.4 / amiga / source / mousehack.c < prev    next >
C/C++ Source or Header  |  1997-03-09  |  3KB  |  142 lines

  1. /*
  2.  * IEvent mouse hack
  3.  *
  4.  * Compile with DCC
  5.  *
  6.  * Copyright 1997 Bernd Schmidt
  7.  */
  8.  
  9. #include <stdio.h>
  10.  
  11. #include <exec/devices.h>
  12. #include <exec/interrupts.h>
  13. #include <exec/nodes.h>
  14. #include <exec/io.h>
  15. #include <exec/memory.h>
  16. #include <intuition/intuitionbase.h>
  17. #include <intuition/preferences.h>
  18. #include <devices/input.h>
  19. #include <devices/inputevent.h>
  20. #include <devices/timer.h>
  21. #include <hardware/intbits.h>
  22. #include <clib/alib_protos.h>
  23. #include <clib/exec_protos.h>
  24.  
  25. int (*calltrap)(__d0 int) = 0xF0FF70;
  26.  
  27. extern void mousehackint(void);
  28.  
  29. struct {
  30.     ULONG mx;
  31.     ULONG my;
  32.     ULONG sigbit;
  33.     struct Task *mt;
  34. } foo;
  35.  
  36. struct Interrupt myint = {
  37.     { 0, 0, NT_INTERRUPT, 5, "UAE mouse hack" },
  38.     &foo,
  39.     mousehackint
  40. };
  41.  
  42. int main(int argc, char **argv)
  43. {
  44.     struct IntuitionBase *ibase;
  45.     struct InputEvent *iev;
  46.     struct IOStdReq *ioreq = 0;
  47.     struct MsgPort *port;
  48.  
  49.     struct timerequest *timereq = 0;
  50.     struct MsgPort *timeport;
  51.     int oldx = 0, oldy = 0;
  52.     int i;
  53.  
  54.     i = (*calltrap) (0);
  55.     if (i == 0) {
  56.     fprintf(stderr, "mousehack not needed for this version of UAE.\n");
  57.     exit (0);
  58.     }
  59.     if (i == -1) {
  60.     fprintf(stderr, "mousehack already running.\n");
  61.     exit (5);
  62.     }
  63.  
  64.     i = AllocSignal (-1);
  65.     if (i < 0)
  66.     goto fail;
  67.     foo.sigbit = 1 << i;
  68.  
  69.     port = CreatePort(0, 0);
  70.     timeport = CreatePort (0, 0);
  71.     if (port)
  72.     ioreq = CreateStdIO(port);
  73.  
  74.     if (timeport)
  75.     timereq = CreateStdIO(timeport);
  76.  
  77.     if (ioreq == 0)
  78.     goto fail;
  79.     if (timereq == 0)
  80.     goto fail;
  81.  
  82.     iev = AllocMem (sizeof (struct InputEvent), MEMF_CLEAR + MEMF_PUBLIC);
  83.     if (iev == 0)
  84.     goto fail;
  85.     if (OpenDevice ("input.device", 0, ioreq, 0) != 0)
  86.     goto fail;
  87.     if (OpenDevice ("timer.device", 0, timereq, 0) != 0)
  88.     goto fail;
  89.  
  90.     foo.mx = (ULONG)-1;
  91.     foo.my = (ULONG)-1;
  92.     foo.mt = FindTask (0);
  93.     AddIntServer(INTB_VERTB, &myint);
  94.  
  95.     ibase = OpenLibrary ("intuition.library", 0);
  96.     SetTaskPri (foo.mt, 20); /* same as input.device */
  97.     for (;;) {
  98.     int newx, newy;
  99.  
  100.     Wait (foo.sigbit);
  101.     ioreq->io_Command = IND_WRITEEVENT;
  102.     ioreq->io_Length = sizeof (struct InputEvent);
  103.     ioreq->io_Data = iev;
  104.     ioreq->io_Flags = IOF_QUICK;
  105.     iev->ie_Class = IECLASS_POINTERPOS;
  106.     iev->ie_SubClass = 0;
  107.     iev->ie_Code = 0;
  108.     iev->ie_Qualifier = 0;
  109. #if 0
  110.     newx = (*calltrap) (1);
  111.     newy = (*calltrap) (2);
  112.  
  113.     if (oldy != newy || oldx != newx)
  114. #endif
  115.     {
  116.         timereq->tr_node.io_Flags = IOF_QUICK;
  117.         timereq->tr_node.io_Command = TR_GETSYSTIME;
  118.         DoIO (timereq);
  119.         iev->ie_TimeStamp = timereq->tr_time;
  120.         /* Those are signed, so I hope negative values are OK... */
  121.         /* I wonder why I have to multiply those by 2... but it works,
  122.          * at least for me. */
  123.         iev->ie_position.ie_xy.ie_x = foo.mx - ibase->ViewLord.DxOffset*2;
  124.         iev->ie_position.ie_xy.ie_y = foo.my - ibase->ViewLord.DyOffset*2;
  125.  
  126.         oldx = newx;
  127.         oldy = newy;
  128.         DoIO(ioreq);
  129.     }
  130. #if 0
  131.     timereq->tr_node.io_Flags = IOF_QUICK;
  132.     timereq->tr_time.tv_secs = 0;
  133.     timereq->tr_time.tv_micro = 20000;
  134.     timereq->tr_node.io_Command = TR_ADDREQUEST;
  135.     DoIO(timereq);
  136. #endif
  137.     }
  138.     fail:
  139.     fprintf (stderr, "Couldn't start mousehack (that's bad!)\n");
  140.     exit (5);
  141. }
  142.